package fiuba.algo3.algoThieft.modelo;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import javax.xml.parsers.ParserConfigurationException;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.xml.sax.SAXException;

public class Interpol implements Deserializable{
	public final static int ESTADO_VALIDO = 0; // INVESTIGANDO
	public final static int LADRON_ATRAPADO =3; // El Ladron fue arrestado
	public final static int ORDEN_ARRESTO_INCORRECTA = 2; // La orden de arresto es incorrecta
	public final static int TIEMPO_AGOTADO = 1; //El tiempo se termino, el ladron huyo
	public static final int ESTADO_INVALIDO = -1;
    private List<Ladron> sospechosos;
    private Ladron sospechosoConOrdenDeArresto;
    private Caso casoActual;
    private int estadoDelCaso;
    
    public Interpol() throws SAXException, IOException, ParserConfigurationException{
        this.sospechosos = new ArrayList<Ladron>();
        Persistor persistor = new Persistor();
        persistor.deserializarDesdeElArchivo(this , "ladrones.xml" );
        this.estadoDelCaso = Interpol.ESTADO_INVALIDO;
        
    }
    
    public int cantidadDeLadrones() {
        return sospechosos.size();
    }
    
    public List<Ladron> emitirOrdenDeArresto(String sexo, String hobby, String cabello, 
                                             String senia, String vehiculo) {
        List<Ladron> ladronesCoincidentes = new ArrayList<Ladron>();
        
        for (int i = 0; i < this.cantidadDeLadrones(); i++){
            Ladron ladron = this.sospechosos.get(i);
            if (ladron.tieneCaracteristicas(sexo, hobby, cabello, senia, vehiculo)){
                ladronesCoincidentes.add(ladron);
            }
        }
            
        if (ladronesCoincidentes.size() == 1){
            this.sospechosoConOrdenDeArresto = ladronesCoincidentes.get(0);
        }
        return ladronesCoincidentes;
    }
    
    public boolean ordenDeArrestoEmitida() {
        return sospechosoConOrdenDeArresto!=null;
    }
    
    public void agregarSospechoso(Ladron ladron) {
        this.sospechosos.add(ladron);
    }

    public void nuevoCaso(Personaje personaje) throws SAXException, IOException, ParserConfigurationException{
        int indiceLadron = (int) (Math.random()* this.sospechosos.size() - 1);
    	Ladron ladron = this.sospechosos.get(indiceLadron);
        this.casoActual= new Caso(ladron,personaje);
        this.estadoDelCaso = Interpol.ESTADO_VALIDO; 
    }

    public Caso getCaso() {
    	
        return this.casoActual;
    }

    @Override
    public void deserializar(Document doc) {
        Element elemento = (Element) doc.getElementsByTagName("Ladrones").item( 0 );
        for ( int i=0 ; i < elemento.getChildNodes().getLength() ; i++ ){
            try {
				this.agregarSospechoso( Ladron.crearLadron ( elemento.getChildNodes().item( i ) ) );
			} catch (ErrorValorNoValido e) {
				//esta linea solo se ejetutaria si en el archivo
				//ladrones.xml hay un ladron mal escrito
				e.printStackTrace();
			}
        }
    }
    
    public void casoTerminado() {
    	
    	if (this.casoActual.elLadronFueArrestado()){
    		this.estadoDelCaso = Interpol.LADRON_ATRAPADO;
    	}else{
    		this.estadoDelCaso = Interpol.ORDEN_ARRESTO_INCORRECTA;
    	}   
    	this.sospechosoConOrdenDeArresto=null;
		this.casoActual = null;
		
	}

	public void intentarArrestar() {
		this.casoActual.intentarArrestar( this.sospechosoConOrdenDeArresto );
	
	}
	
	public int getEstadoDelCaso(){
		return this.estadoDelCaso;
	}

	public void casoTerminadoPorTiempo() {
		this.estadoDelCaso = Interpol.TIEMPO_AGOTADO;
		this.casoActual = null;		
	}
}